BOJ_14921_용액 합성하기
투 포인터(Two-Pointers)를 사용해서 0에 가까운 합을 찾는 문제
입력이 정렬되어 들어오기 때문에 투포인터를 떠올리는 것까지는 어렵지 않았지만,
포인터를 넘기는 기준을 잘못 잡아서 틀렸었다.
두 수의 합이 지금까지 구한 가장 0에 가까운 수보다 작으면 -> end -= 1
크면 -> start += 1 을 해줬는데
이는 이전에 구했던 가장 0에 가까운 수와의 크기 비교일 뿐이라서
0에 더 가까운 조합을 놓칠 수 있다
따라서 정확한 방식으로 하려면 포인터 조작의 기준을 0으로 해야 한다
더한 값이 0보다 크다면, 더 작은 수가 필요하기 때문에 end -= 1을 한다
반대로 더한 값이 0보다 작다면, 더 큰 수가 필요하기 때문에 start += 1을 해준다
이렇게 해야 0에 가까운 합을 찾을 수 있다
import sys
# 투포인터
input = sys.stdin.readline
N = int(input())
values = list(map(int, input().split()))
start = 0
end = N - 1
zero_friend = sys.maxsize
origin = sys.maxsize
while start < end:
plus = values[start] + values[end]
if abs(plus) < zero_friend:
zero_friend = abs(plus)
origin = plus
if plus < 0:
start += 1
else:
end -= 1
print(origin)